/* Copyright Statement:
*
* This software/firmware and related documentation ("MediaTek Software") are
* protected under relevant copyright laws. The information contained herein
* is confidential and proprietary to MediaTek Inc. and/or its licensors.
* Without the prior written permission of MediaTek inc. and/or its licensors,
* any reproduction, modification, use or disclosure of MediaTek Software,
* and information contained herein, in whole or in part, shall be strictly prohibited.
*/
/* MediaTek Inc. (C) 2010. All rights reserved.
*
* BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
* THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
* CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
* SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
* STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
* CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
*
* The following software/firmware and/or related documentation ("MediaTek Software")
* have been modified by MediaTek Inc. All revisions are subject to any receiver's
* applicable license agreements with MediaTek Inc.
*/
/*
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.music;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.media.audiofx.AudioEffect;
import android.media.audiofx.BassBoost;
import android.media.audiofx.Equalizer;
import android.media.audiofx.PresetReverb;
import android.media.audiofx.Virtualizer;
import android.util.Log;
public class AudioEffectReceiver extends BroadcastReceiver {
private static final String TAG = "AudioEffectReceiver";
private static final String ATTACHAUXAUDIOEFFECT = "com.android.music.attachauxaudioeffect";
private static final String DETACHAUXAUDIOEFFECT = "com.android.music.detachauxaudioeffect";
private static final String PREFTAG_EFFECTS_ENABLED = "effectsenabled";
private static final String PREFTAG_SELECTED_EFFECTS = "selectedeffecttype";
private static final String PREFTAG_BASSBOOST_LEVEL = "bassboostlevel";
private static final String PREFTAG_VIRTUALIZER_LEVEL = "virtualizerlevel";
private static final String PREFTAG_REVERB_PRESET = "reverbpreset";
private static final String PREFTAG_EQ_PRESET = "equalizerpreset";
private Context mContext;
//private static int mCurrentSession = 0;
public void onReceive(Context context, Intent intent) {
Log.i(TAG, "[onReceive] action = " + intent.getAction());
mContext = context;
String action = intent.getAction();
String packageName = intent.getStringExtra(AudioEffect.EXTRA_PACKAGE_NAME);
int audioSession = 0;
if (action.equals(AudioEffect.ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION)) {
audioSession = intent.getIntExtra(AudioEffect.EXTRA_AUDIO_SESSION, 0);
setAudioEffect(audioSession, packageName);
//mCurrentSession = audioSession;
AudioEffectControlPanel.mAudioSession = audioSession;
} else if (action.equals(AudioEffect.ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION)) {
// TODO: close effect control sessions
audioSession = intent.getIntExtra(AudioEffect.EXTRA_AUDIO_SESSION, 0);
if (audioSession == AudioEffectControlPanel.mAudioSession) {
closeEffects();
}
}
}
private void setAudioEffect(int audioSession, String packageName) {
Log.d(TAG, "setAudioEffect(" + audioSession + ", " + packageName + ")");
AudioEffect audioEffect;
SharedPreferences preference;
if (packageName == mContext.getPackageName()) {
Log.d(TAG, "setAudioEffect: com.android.music package..");
preference = mContext.getSharedPreferences("com.android.music_effect_settings", Context.MODE_PRIVATE);
} else {
preference = mContext.getSharedPreferences("com.android.music_effect_settings", Context.MODE_PRIVATE);
}
boolean enabled = preference.getBoolean(PREFTAG_EFFECTS_ENABLED, false);
Log.d(TAG, "setAudioEffect: enabled=" + enabled);
if (!enabled)
return;
boolean bSameSession = AudioEffectControlPanel.mAudioSession == audioSession;
Log.d(TAG, "setAudioEffect: sameSession=" + bSameSession);
int checkedEffects = preference.getInt(PREFTAG_SELECTED_EFFECTS, 0);
int bassLevel = preference.getInt(PREFTAG_BASSBOOST_LEVEL, 500);
int virtualizerLevel = preference.getInt(PREFTAG_VIRTUALIZER_LEVEL, 500);
short reverbPreset = (short) preference.getInt(PREFTAG_REVERB_PRESET, PresetReverb.PRESET_NONE);
short eqPreset = (short) preference.getInt(PREFTAG_EQ_PRESET, 0);
Log.d(TAG, "setAudioEffect: mBassBoost=" + AudioEffectControlPanel.mBassBoost +
", mVirtualizer=" + AudioEffectControlPanel.mVirtualizer +
", mPresetReverb=" + AudioEffectControlPanel.mPresetReverb +
", mEqualizer=" + AudioEffectControlPanel.mEqualizer);
// Restore previously selected audio effects
if ((checkedEffects & 1) != 0) {
Log.d(TAG, "restore BassBoost");
if (AudioEffectControlPanel.mBassBoost == null) {
AudioEffectControlPanel.mBassBoost = new BassBoost(0, audioSession);
} else if (!bSameSession) {
AudioEffectControlPanel.mBassBoost.release();
AudioEffectControlPanel.mBassBoost = new BassBoost(0, audioSession);
}
if(AudioEffectControlPanel.mBassBoost.getStrengthSupported()) {
AudioEffectControlPanel.mBassBoost.setStrength((short) bassLevel);
}
AudioEffectControlPanel.mBassBoost.setEnabled(true);
Log.i(TAG, "BassBoost restored to session [" + audioSession + "] !!");
}
if ((checkedEffects & (1 << 1)) != 0) {
Log.d(TAG, "restore Virtualizer");
if (AudioEffectControlPanel.mVirtualizer == null) {
AudioEffectControlPanel.mVirtualizer = new Virtualizer(0, audioSession);
} else if (!bSameSession) {
AudioEffectControlPanel.mVirtualizer.release();
AudioEffectControlPanel.mVirtualizer = new Virtualizer(0, audioSession);
}
if(AudioEffectControlPanel.mVirtualizer.getStrengthSupported()) {
AudioEffectControlPanel.mVirtualizer.setStrength((short) virtualizerLevel);
}
AudioEffectControlPanel.mVirtualizer.setEnabled(true);
Log.i(TAG, "Virtualizer restored to session [" + audioSession + "] !!");
}
if ((checkedEffects & (1 << 2)) != 0) {
Log.d(TAG, "restore PresetReverb");
// PresetReverb is an auxiliary effect, so attach this effect directly to session 0, i.e. the main audio output mix
if (AudioEffectControlPanel.mPresetReverb == null) {
AudioEffectControlPanel.mPresetReverb = new PresetReverb(0, 0);
//AudioEffectControlPanel.mPresetReverb = new PresetReverb(0, audioSession);
} else if (!bSameSession) {
AudioEffectControlPanel.mPresetReverb.release();
//AudioEffectControlPanel.mPresetReverb = new PresetReverb(0, audioSession);
AudioEffectControlPanel.mPresetReverb = new PresetReverb(0, 0);
}
AudioEffectControlPanel.mPresetReverb.setPreset(reverbPreset);
AudioEffectControlPanel.mPresetReverb.setEnabled(true);
// Send a broadcast containing the effect id to Music app to attach auxiliary effect to MediaPlayer instance
Intent it_aux = new Intent(ATTACHAUXAUDIOEFFECT);
it_aux.putExtra("auxaudioeffectid", AudioEffectControlPanel.mPresetReverb.getId());
mContext.sendBroadcast(it_aux);
Log.i(TAG, "PresetReverb restored to session [0] !");
}
if ((checkedEffects & (1 << 3)) != 0) {
Log.d(TAG, "restore Equalizer");
if (AudioEffectControlPanel.mEqualizer == null) {
AudioEffectControlPanel.mEqualizer = new Equalizer(0, audioSession);
} else if (!bSameSession) {
AudioEffectControlPanel.mEqualizer.release();
AudioEffectControlPanel.mEqualizer = new Equalizer(0, audioSession);
}
AudioEffectControlPanel.mEqualizer.setEnabled(true);
AudioEffectControlPanel.mEqualizer.usePreset(eqPreset);
Log.i(TAG, "Equalizer restored to session[" + audioSession + "] !!");
}
/*
switch (checkedPos) {
// "case 0" is ignored
case 1:
audioEffect = new BassBoost(0, audioSession);
if(((BassBoost)audioEffect).getStrengthSupported()) {
((BassBoost)audioEffect).setStrength((short) bassLevel);
}
audioEffect.setEnabled(true);
Log.i(TAG, "BassBoost effect has been restored to audio session [" + audioSession + "] !!");
break;
case 2:
audioEffect = new Virtualizer(0, audioSession);
if(((Virtualizer)audioEffect).getStrengthSupported()) {
((Virtualizer)audioEffect).setStrength((short) virtualizerLevel);
}
audioEffect.setEnabled(true);
Log.i(TAG, "Virtualizer effect has been restored to audio session [" + audioSession + "] !!");
break;
case 3:
// PresetReverb is an auxiliary effect, so attach this effect directly to session 0, i.e. the main audio output mix
audioEffect = new PresetReverb(0, 0);
((PresetReverb)audioEffect).setPreset(reverbPreset);
audioEffect.setEnabled(true);
// Send a broadcast containing the effect id to Music app to attach auxiliary effect to MediaPlayer instance
Intent it_aux = new Intent(ATTACHAUXAUDIOEFFECT);
it_aux.putExtra("auxaudioeffectid", audioEffect.getId());
mContext.sendBroadcast(it_aux);
Log.i(TAG, "PresetReverb effect has been restored to audio session [" + audioSession + "] !!");
break;
case 4:
audioEffect = new Equalizer(0, audioSession);
((Equalizer)audioEffect).setEnabled(true);
((Equalizer)audioEffect).usePreset(eqPreset);
Log.i(TAG, "Equalizer effect has been restored to audio session[" + audioSession + "] !!");
break;
default:
Log.e(TAG, "Invalid selected effect!!");
}
*/
}
private void closeEffects() {
Log.d(TAG, "closeEffects");
if (AudioEffectControlPanel.mBassBoost != null) {
AudioEffectControlPanel.mBassBoost.setEnabled(false);
AudioEffectControlPanel.mBassBoost.release();
AudioEffectControlPanel.mBassBoost = null;
Log.d(TAG, "closeEffects: bassboost disabled");
}
if (AudioEffectControlPanel.mVirtualizer != null) {
AudioEffectControlPanel.mVirtualizer.setEnabled(false);
AudioEffectControlPanel.mVirtualizer.release();
AudioEffectControlPanel.mVirtualizer = null;
Log.d(TAG, "closeEffects: virtualizer disabled");
}
if (AudioEffectControlPanel.mPresetReverb != null) {
AudioEffectControlPanel.mPresetReverb.setEnabled(false);
Intent i = new Intent(DETACHAUXAUDIOEFFECT);
i.putExtra("auxaudioeffectid", AudioEffectControlPanel.mPresetReverb.getId());
mContext.sendBroadcast(i);
AudioEffectControlPanel.mPresetReverb.release();
AudioEffectControlPanel.mPresetReverb = null;
Log.d(TAG, "closeEffects: presetreverb disabled");
}
if (AudioEffectControlPanel.mEqualizer != null) {
AudioEffectControlPanel.mEqualizer.setEnabled(false);
AudioEffectControlPanel.mEqualizer.release();
AudioEffectControlPanel.mEqualizer = null;
Log.d(TAG, "closeEffects: equalizer disabled");
}
}
}